'''
位运算符把数字看作二进制数来进行计算的
23123123
按“位与”运算（&）

按“位或”运算（|）

按位与（AND）运算符：&
按位或（OR）运算符：|
按位异或（XOR）运算符：^
按位取反（NOT）运算符：~
左移（Shift Left）运算符：<<
右移（Shift Right）运算符：>>
这些位运算符在处理位级别的操作时非常有用，例如在处理硬件、加密、数据压缩等领域。
01 0110
01 1111
00 1001

0000 0000 0000 0100
1111 1111 1111 1011

111 1011
000 0100

1111111111111111111111111111111111111111111111111111111110000100


'''

print('按位与运算', 12 & 8)  # 12 = 1100, 8 = 1000, 12 & 8 = 1000 = 8 上下都有1，则取1,后转为十进制
print('按位或运算', 4 | 8)  # 4 = 0100, 8 = 1000, 4 | 8 = 1100 = 12 上下只有其中有1则取1,后转为十进制
print('按位异或运算', 31 ^ 22)  # 31 = 11111, 22 = 10110, 31 ^ 32 =1001  = 9 同位相同为0，不同为1
print('按位取反运算',
      ~123)  # 123 = 0111 1111 1111 1111 1111 1111 0111 1011, ~123 = 1000 0000 0000 0000 0000 0000 1000 0100
print('按左移位运算', 2 << 2)  # 2 = 0010, 2 << 2 = 1000 = 8 左移2位，相当于乘以2的2次方  2*2**2
print('按左移位运算', 2 << 3)  # 2 = 0010, 2 << 3 = 10000 = 16 左移3位，相当于乘以2的3次方 2*2**3

# “右移位”运算（>>）是将一个二进制数向右移动指定的位数，右边（低位端）溢出的位被丢弃，左边（高位端）的空位端，如果最高位是0（正数）左侧空位填0，如果最高位是1（负数），左侧空位填1。
print('按右移位运算', 8 >> 2)  # 8 = 1000, 8 >> 2 = 0010 = 2 右移2位，相当于除以2的2次方
print('按右移位运算', -8 >> 2)  # -8 = 1111 1111 1111 1111 1111 1111 1000 1000, -8 >> 2 = 1111 1111 1111 1111 1111 1111 1111 1100 = -2 右移2位，相当于除以2的2次方


'''
 运算顺序
  **                       幂运算
  ~、+、-                  取反、正号、负号
  *、/、%、//              川算术运算符
  +、-                     算术运算符
  <<、>>                   位运算符中的左移位和右移位
  &                        位运算符中的按位与
  ^                        位运算符中的异或
  |                        位运算符中的按位或
  <、<=、>、>=、!=、==       比较运算符
  =                        赋值运算符
'''